﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SeguroSoft.Model.Model;

namespace SeguroSoft.Models
{
    public class RepositorioSeguro : SeguroSoft.Models.IRepositorioSeguro
    {
        SeguroSoftDBDataContext db = new SeguroSoftDBDataContext();

        //Métodos de Consulta


        /// <summary>
        /// Devuelve todos los seguros en la base de datos
        /// </summary>
        /// <returns></returns>
        public IQueryable<Seguro> EncontrarTodosLosSeguros()
        {
            return db.Seguros;
        }


        /// <summary>
        /// Devuelve todos los seguros que cumplen con que su deducible es menor, mayor o igual a alguna cantidad.
        /// El primer parámetro debe ser 1 si se quiere buscar por "mayor a", 2 para "menor a" ó cualquier número para "igual a"
        /// </summary>
        /// <param name="opcion"></param>
        /// <param name="deducible"></param>
        /// <returns></returns>
        public IQueryable<Seguro> EncontrarSegurosPorDeducible(int opcion, int deducible)
        {

            if (opcion == 1)
            {
                return from seguro in db.Seguros
                       where seguro.Deducible > deducible
                       orderby seguro.Deducible
                       select seguro;

            }

            if (opcion == 2)
            {
                return from seguro in db.Seguros
                       where seguro.Deducible < deducible
                       orderby seguro.Deducible
                       select seguro;

            }

            else
            {
                return from seguro in db.Seguros
                       where seguro.Deducible == deducible
                       orderby seguro.Deducible
                       select seguro;
            }
        }


        /// <summary>
        /// Devuelve todos los seguros que cumplen con que su prima es menor, mayor o igual a alguna cantidad.
        /// El primer parámetro debe ser 1 si se quiere buscar por "mayor a", 2 para "menor a" ó cualquier número para "igual a"
        /// </summary>
        /// <param name="opcion"></param>
        /// <param name="prima"></param>
        /// <returns></returns>
        public IQueryable<Seguro> EncontrarSegurosPorPrima(int opcion, int prima)
        {

            if (opcion == 1)
            {
                return from seguro in db.Seguros
                       where seguro.Prima > prima
                       orderby seguro.Prima
                       select seguro;

            }

            if (opcion == 2)
            {
                return from seguro in db.Seguros
                       where seguro.Prima < prima
                       orderby seguro.Prima
                       select seguro;

            }

            else
            {
                return from seguro in db.Seguros
                       where seguro.Prima == prima
                       orderby seguro.Prima
                       select seguro;
            }
        }


        /// <summary>
        /// Devuelve todos los seguros según año del vehículo.
        /// </summary>
        /// <param name="opcion"></param>
        /// <param name="año"></param>
        /// <returns></returns>
        public IQueryable<Seguro> EncontrarSegurosPorAño(int año)
        {
                return from seguro in db.Seguros
                       where seguro.Año == año
                       orderby seguro.Año
                       select seguro;
        }


        /// <summary>
        /// Devuelve un seguro según un modelo de auto específico que este cubra.
        /// </summary>
        /// <param name="modelo"></param>
        /// <returns></returns>
        public IQueryable<Seguro> EncontrarSegurosPorModelo(string modelo)
        {
            return from seguro in db.Seguros
                   where seguro.Modelo.Equals(modelo)
                   orderby seguro.Modelo
                   select seguro;
        }

        /// <summary>
        /// Devuelve un seguro según una marca de auto específica que este cubra.
        /// </summary>
        /// <param name="marca"></param>
        /// <returns></returns>
        public IQueryable<Seguro> EncontrarSegurosPorMarca(string marca)
        {
            return from seguro in db.Seguros
                   where seguro.Marca.Equals(marca)
                   orderby seguro.Marca
                   select seguro;
        }


        /// <summary>
        /// Devuelve un seguro específico de acuerdo a su ID
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Seguro ObtenerSeguro(int id)
        {
            return db.Seguros.SingleOrDefault(d => d.IDSeguros == id);
        }

        /// <summary>
        /// Guarda los cambios en la base de datos.
        /// </summary>
        public void Guardar()
        {
            db.SubmitChanges();
        }

        public List<Comentario> EntontrarComentarioServicio(int id)
        {
            IQueryable<int> idcomentarios = from tist in db.TIs
                                            where tist.IDSeguro == id
                                            select tist.IDComentario;
            List<Comentario> comentarios = new List<Comentario>();
            foreach (int idcomentario in idcomentarios)
            {
                IQueryable<Comentario> aux = from comentario in db.Comentarios
                                             where comentario.IDComentario == idcomentario
                                             select comentario;
                comentarios.AddRange(aux.ToList());
            }
            return comentarios;
        }

        public void crearTis(TI tist)
        {
            db.TIs.InsertOnSubmit(tist);
            this.Guardar();
        }




    }
}